package com.itheima.tliasmanagementspringboot.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.tliasmanagementspringboot.annotation.Log;
import com.itheima.tliasmanagementspringboot.mapper.EmpMapper;
import com.itheima.tliasmanagementspringboot.pojo.Emp;
import com.itheima.tliasmanagementspringboot.common.PageBean;
import com.itheima.tliasmanagementspringboot.dtos.PageDto;
import com.itheima.tliasmanagementspringboot.pojo.Result;
import com.itheima.tliasmanagementspringboot.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    EmpMapper empMapper;

    /**
     * 查询所有员工信息
     *
     * @return 查询到的员工信息的集合
     */
    @Override
    public List<Emp> queryAllEmpService() {

        return empMapper.queryAllEmpMapper();
    }

    /**
     * 功能: 根据id查询员工信息
     *
     * @return 查询到的员工信息
     */
    @Override
    public Emp queryEmpByConditionService(Integer id) {
        //屏蔽一些敏感字段(比如密码,或者隐私信息)
        return empMapper.queryEmpByConditionMapper(id);
    }

    /**
     * 功能: 根据id删除员工信息
     */
    @Override
    public void deleteEmpByIds(Integer[] ids) {
        empMapper.deleteEmpByIds(ids);
    }

    /**
     * 功能: 添加/插入一条员工信息
     *
     * @param emp 插入的员工数据
     */
    @Override
    public void insertEmpService(Emp emp) {
        //弄个全局异常即可
        /*if (empMapper.queryEmpNameByNameMapper(emp.getUsername()) != 0) {
            throw new RuntimeException("用户名重复!");
        }*/
        //补全一些基础字段的信息(如:时间,密码,状态等等)
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        //密码不能明文,不安全,现在常用MD5
        String md5Password = DigestUtils.md5DigestAsHex("123456".getBytes(StandardCharsets.UTF_8));
        emp.setPassword(md5Password);//数据库禁止存明文
        empMapper.insertEmpMapper(emp);
    }

    /**
     * 功能:根据id更新员工信息
     *
     * @param emp :员工id
     */
    @Override
    @Log
    public void updateEmpByIdService(Emp emp) {
        //弄个全局异常即可
//        if (empMapper.queryEmpNameByNameMapper(emp.getUsername()) != 0) {
//            throw new RuntimeException("用户名重复!");
//        }

        empMapper.updateEmpByIdMapper(emp);
    }

    /**
     * 功能:分页查询员工信息
     *
     * @param pageDto 请求参数
     * @return 返回的是封装后的查询到的数据集合和总条数的对象
     */
    @Override
    @Log
    public PageBean<Emp> pageQueryEmpService(PageDto pageDto) {
        //传统方式

//        pageDto.setPage((pageDto.getPage() - 1) * pageDto.getPageSize());//处理分页的起始位置
//        //1.查数据集合
//        List<Emp> emps = empMapper.PageQueryEmpListMapper(pageDto);
//
//        //2.查总条数
//        Integer total = empMapper.PageQueryEmpTotalMapper(pageDto);
//
//        //3.将上面两个数据封装到PageBean中
//        return new PageBean(total,emps);

        System.out.println("业务层:" + pageDto);
        //分页插件
        //1.开启分页,紧接着的第一个select会自动分页
        PageHelper.startPage(pageDto.getPage(), pageDto.getPageSize());

        //2.直接条件查询即可
        List<Emp> emps = empMapper.pageQueryEmpListMapper(pageDto);
        Page<Emp> p = (Page<Emp>) emps;

        return new PageBean(p.getTotal(), p.getResult());
    }

    /**
     * 根据性别统计员工人数
     */
    @Override
    public List<Map<String, Integer>> queryCountGroupByGenderService() {
        return empMapper.queryCountGroupByGender();
    }

    /**
     * 功能: 根据job统计人数
     * @return 返回的是job种类集合,每种job的人数的集合(两个集合放在Map集合中)
     */
    @Override
    public Map<String, List<Object>> queryCountGroupByJobService() {
        //1.将班级和学员人数封装后统计出来
        List<Map<String, Object>>  listMap = empMapper.queryCountGroupByJob();
        System.out.println("业务层" + listMap);
        //2.将班级信息和人数信息分别取出来放入List集合中
        Map<String, List<Object>> maps  = new HashMap<>();
        /*List<Object> dataList = new ArrayList<>();
        List<Object> categoryList = new ArrayList<>();*/
        /*listMap.forEach(m->{
            categoryList.add(m.get("name"));
            dataList.add(m.get("value"));
        });*/
        List<Object> categoryList = listMap.stream().map(m -> m.get("name")).collect(Collectors.toList());
        List<Object> dataList = listMap.stream().map(m -> m.get("value")).collect(Collectors.toList());
        maps.put("categoryList", categoryList);
        maps.put("dataList", dataList);
        return maps;
    }

    /**
     * 功能: 登录操作
     * @param emp 接收到的请求的用户信息
     * @return
     */
    @Override
    public Emp loginOperationService(Emp emp) {
        //区分用户名和密码错误(改一下)
        //根据用户名查询到信息
        Emp empLogin = empMapper.queryInfoByUsername(emp);
        //1.先判断是否为空,空代表用户名有误,导致查不到对应的用户
        if (empLogin == null) {
            empLogin = new Emp();
            empLogin.setUsername(null);
        }else {
            if (!empLogin.getPassword().equals(emp.getPassword())) {
                empLogin.setPassword(null);
            }
        }
        return empLogin;
    }
}
